package br.inf.battleship.v02;

import java.awt.Point;
import java.util.Scanner;
import static java.lang.System.out;

public class LocalGame extends Game {
    /* LocalGame = HumanPlayer vs ComputerPlayer */

    HumanPlayer hm;
    ComputerPlayer cp;

    public LocalGame() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Player 1: Type your name");
        hm = new HumanPlayer(sc.next());
        cp = new ComputerPlayer("Computer");
        System.out.println("Hello " + hm.getName() + "\nWelcome to BattleShip\n");
        start(hm);
        start(cp);
        playGame();

    }
    public LocalGame(HumanPlayer hm , ComputerPlayer cp){
        start(hm);
        start(cp);
        playGame();
    }

    @Override
    public void playGame() {
        Player atualPlayer = (Player) turn.getFirst();
        while (!atualPlayer.isWinner()) {
            Player nextPlayer = (Player) turn.get(1);
            out.println("Vez do " + atualPlayer.getName() + " jogar:");
            Point positionAttack = atualPlayer.attack();
            out.println(atualPlayer.name + " atirou na Linha:" + positionAttack.y +
                    ",Coluna:" + positionAttack.x);

            //acertou algum barco
            if ((!(nextPlayer.getBoard().wasAttacked(positionAttack)) && !(nextPlayer.getBoard().isFree(positionAttack))) == true) {
                out.println(atualPlayer.name+" acertou um barco");
                //verificar qual barco foi acertado
                int positionValue = nextPlayer.board.getValueOfBoard(positionAttack);
                //atribuir valor de bombardeado no campo do tiro
                nextPlayer.board.setValueOfBoard(positionAttack, BoardManager.TYPE_BOMBED);
                //incrementa quantidade de posições destruídas do barco

                nextPlayer.shipArray[positionValue].sumDestroyedParts(1);
                //verifica se barco foi destruido
                if (!nextPlayer.shipArray[positionValue].isAlive()) {
                    //barco destruido
                    //incrementa pontuação jogador
                    atualPlayer.pontuation++;
                    out.println(atualPlayer.name + " destruiu um barco");
                }
                //joga novamente
                continue;
            } //errou o tiro
            else if (nextPlayer.getBoard().isFree(positionAttack) == true) {
                out.println("Agua");
                //atribuir valor de bombardeado no campo do tiro
                nextPlayer.board.setValueOfBoard(positionAttack, BoardManager.TYPE_BOMBED);
            } else {
                //se posição errada ou já bombardeada, volta a rodada
                out.println("Posição já bombardeada/inexistente");
                continue;
            }
            nextPlayer.board.printMap(nextPlayer.name);
            //passa a vez
            passTurn(atualPlayer);
           // atualiza jogador atual
            atualPlayer = (Player) turn.getFirst();
        }
        // o vencedor foi o último jogador atual
        printWinner(atualPlayer);
        //fim de jogo
        gameOver();
    }
    @Override
    public void gameOver(){
        Scanner sc = new Scanner(System.in);
        out.print("Deseja jogar novamente(s/n):");
        if(sc.next().charAt(0)=='s') new LocalGame(hm,cp);
        else System.exit(0);
    }
}
